import os
import pyYJKSModel                                                          #导入YJK-pyYJKSModel   help(pyYJKSModel)函数可以查看所有类与函数;
#import pyYJKSParam                                                          #特殊构件定义模块
import pyYJKCommand
import pyYJKSUI
#节点生成的函数
#输入参数包括关于x向布点的参数xspans、y向布点的参数yspans、标准层bzc以及上节点高Eon
#最终输出一个二维节点向量nodelist[index_x][index_y]
def node_generate(xspans,yspans,bzc,Eon=0):
    xp = 0                                                          
    nodelist = []  
    for nodex in range(len(xspans)):
        yp = 0
        xp += xspans[nodex]
        node_combine=[]
        for nodey in range(len(yspans)):
            node = pyYJKSModel.creatNode()                          # 创建节点
            node.setX(xp)                                           # 设置节点X坐标
            yp += yspans[nodey]
            node.setY(yp)                                           # 设置节点Y坐标
            node.setEon(Eon)                                        # 设置节点的上节点高
            bzc.addEntity(node)                                     # 将节点添加至标准层
            node_combine.append(node)
        nodelist.append(node_combine) 
    return nodelist
#网格生成函数
#输入参数包括二维节点向量nodelist、相关参数direct_x、direct_y
#输出一个一维的网格列表gridlist
def grid_generate(nodelist,direct_x,direct_y):
    gridlist = []
    bzc=nodelist[0][0].getBzc()
    for ix in range(len(nodelist)):                                   
        for iy in range(len(nodelist[ix])):
            if iy< len(nodelist[0])-1 and direct_y:                  # 创建Y方向的网格
                grid = pyYJKSModel.creatGrid()                       # 创建网格
                grid.setNode1Ptr(nodelist[ix][iy])                   # 设置网格线的第一个点
                grid.setNode2Ptr(nodelist[ix][iy+1])                 # 设置网格线的第二个点
                bzc.addEntity(grid)                                  # 将生成的网格线添加至标准层
                gridlist.append(grid)                                # 将grid加入待输出列表
            if ix < len(nodelist)-1 and direct_x:                    # 创建X方向的网格，其余同上
                grid = pyYJKSModel.creatGrid()                       
                grid.setNode1Ptr(nodelist[ix][iy])                   
                grid.setNode2Ptr(nodelist[ix+1][iy])
                bzc.addEntity(grid)
                gridlist.append(grid)
    return gridlist
#墙布置函数
#输入参数包括一维的网格列表gridlist和墙定义defwall
#输出墙列表
def wall_arrange(gridlist,defwall):
    wall_list=[]
    bzc=gridlist[0].getBzc()
    for grid in gridlist:
        wall = pyYJKSModel.creatWall()                      # 创建墙
        wall.setGridID(grid.getID())                        # 设置网格ID
        wall.setDefID(defwall.getID())                      # 设置墙定义
        wall_list.append(wall)                              # 将wall加入待输出列表
        bzc.addEntity(wall)                                 # 将墙添加至标准层    
#墙洞布置函数
#输入参数包括一维的网格列表gridlist和墙洞定义defwindow
#输出墙洞列表
def wallhole_arrange(gridlist,defwindow):
    wallhole_list=[]
    bzc=gridlist[0].getBzc()
    for grid in gridlist:
        wallhole = pyYJKSModel.creatWindow()                    # 创建墙洞
        wallhole.setGridID(grid.getID())                        # 设置网格ID
        wallhole.setDefID(defwindow.getID())                    # 设置墙洞定义
        wallhole.setEC(0)                                       # 设置距起点的距离
        wallhole.setEZ(0)                                       # 设置底标高
        wallhole_list.append(wallhole)                          # 将wallhole加入待输出列表
        bzc.addEntity(wallhole)                                 # 将墙洞添加至标准层
#标准层复制函数
#输入参数包括起始高度H_start、标准层bzc、复制次数number、层高height
def bzc_copy(H_start,bzc,number,height):
    for r in range(number):
        zrc = pyYJKSModel.defZrc()                           # 创建自然层
        zrc.setBzcID(bzc.getID())                            # 设置标准层ID
        zrc.setLevel(H_start+height*r)                       # 设置自然层底标高
        zrc.setHeight(height)                                # 设置层高
        ydb.addZrc(zrc)   
#主体建模函数
def TestBuild():
    global ydb
    ydb = pyYJKSModel.creatProjEx()                          # 创建工程
    pyYJKSModel.yjkProj.init(ydb)                            # 初始化工程文件
    bzc = pyYJKSModel.defBzc()                               # 定义标准层
    bzc.setDead(12.0)                                         # 设置标准层的恒载
    bzc.setLive(3.0)                                        # 设置标准层的活载
    bzc.setHeight(3000)                                      # 设置标准层层高
    ydb.addBzc(bzc)                                          # 将标准层加入ydb
    #墙定义
    defwall = pyYJKSModel.defWall()                          # 添加墙定义
    defwall.setK(1)                                          # 设置墙类型
    defwall.setT(200)                                        # 设置墙厚
    defwall.setM(6)                                          # 设置墙材料
    ydb.addWall(defwall)                                     # 将墙定义添加至ydb   
    #墙洞定义
    defwallhole = pyYJKSModel.defWindow()                    # 墙洞定义
    defwallhole.setB(900)                                    # 设置墙洞的宽度
    defwallhole.setH(2500)                                   # 设置墙洞的高度
    ydb.addWindow(defwallhole)                               # 将墙洞定义添加至ydb
    #剪力墙布置,墙洞布置
    originpos = [[0,0],[7000,8000],[28000,0],[21000,8000]] 
    for node in originpos:
        xspans = [node[0],3500,3500]                         # X向开间
        yspans = [node[1],3000,5000]                         # Y向开间
        nodelist=node_generate(xspans,yspans,bzc)            # 生成节点列表nodelist
        gridlist=grid_generate(nodelist,1,1)             # 由nodelist生成X向及Y向网格
        wall_arrange(gridlist,defwall)                   # 布置墙
        wallhole_arrange(gridlist,defwallhole)           # 布置墙洞
    originpos=[[7000,0],[17500,0]]
    for node in originpos:
        xspans = [node[0],3500,3500,3500]
        yspans = [node[1],8000]
        nodelist=node_generate(xspans,yspans,bzc)    
        gridlist=grid_generate(nodelist,1,1)
        wall_arrange(gridlist,defwall)
        wallhole_arrange(gridlist,defwallhole)   
    #标准层复制
    bzc_copy(0,bzc,18,3000)
    save = pyYJKSModel.SaveYDB("pymodel", ydb)                              # 保存ydb文件，自定义文件名
    print(save)      
    return 0 

def yjksetLabel(IDString):                                                  # 切换YJK模块Ribbon菜单
    pyYJKSUI.QSetCurrentRibbonLabel(IDString, 1)
    return 1   

def pyyjks(com):                                                            # 入口函数
    Module_Axis = yjksetLabel("IDModule_Axis")                              # 将标签栏切换至轴线网格
    if Module_Axis:
        pyYJKSUI.QViewSetCursorPos(0,0)                                     # 控制鼠标停留在绘图点（0，0）
        TestBuild() 
    importmodel = pyYJKSUI.QRunCommandEx("yjk_importydb", "pymodel.ydb", 0) # 导入已经生成的ydb模型pymodel
    pyYJKCommand.RunCommand("yjk_setlayersupport")                          # 前处理
    pyYJKCommand.RunCommand("yjk_repairex")                                 # 修复
    pyYJKCommand.RunCommand("yjk_save")                                     # 保存到项目
    if importmodel:
        pyYJKSUI.QViewSetCursorPos(0, 0)                                    # 控制鼠标停留在绘图点（0，0）
    Module_Pre = yjksetLabel("IDSPRE_ROOT")                                 # 进入前处理模块
    pyYJKCommand.RunCommand("yjkdesign_dsncalculating_all")                 # 生成数据+全部计算
    yjksetLabel("IDDSN_DSP")                                                # 进入设计结果模块
    return (com)
TestBuild()